//
//  MOPushClient.h
//  MOPush
//
//  Created by alfie on 2021/3/22.
//
//  默往推送SDK核心类
//
//  Version：1.2.3
//  新增：如果启动SDK失败，会自动尝试重新启动

#import <Foundation/Foundation.h>
#import "MOPushResponse.h"

typedef void (^MOPushCompletion)(MOPushResponse *response);

/*!
 * @enum MOPushAuthorizationOptions
 *
 * @brief 通知注册实体类支持的类型
 */
typedef NS_OPTIONS(NSUInteger, MOPushAuthorizationOptions) {
    MOPushAuthorizationOptionNone    = 0,
    MOPushAuthorizationOptionBadge   = (1 << 0),
    MOPushAuthorizationOptionSound   = (1 << 1),
    MOPushAuthorizationOptionAlert   = (1 << 2),
    MOPushAuthorizationOptionCarPlay = (1 << 3),
    MOPushAuthorizationOptionCriticalAlert = (1 << 4), ///< __API_AVAILABLE ios(12.0)
    MOPushAuthorizationOptionProvidesAppNotificationSettings = (1 << 5), // __API_AVAILABLE ios(12.0)
    MOPushAuthorizationOptionProvisional = (1 << 6),   ///< __API_AVAILABLE ios(12.0)
    MOPushAuthorizationOptionAnnouncement = (1 << 7),  ///< __API_AVAILABLE ios(13.0)
};

/*!
 * @enum MOPushDeleteAliasOption
 *
 * @brief 删除别名的方式
 */
typedef NS_ENUM(NSUInteger, MOPushDeleteAliasOption) {
    MOPushDeleteAliasOptionAll,    ///< 删除该别名绑定的所有设备
    MOPushDeleteAliasOptionSelf,   ///< 删除该别名绑定的当前设备
    MOPushDeleteAliasOptionOthers, ///< 删除该别名绑定的其他设备，当前设备不会删除
};


/// 通知注册实体类
@interface MOPushRegisterEntity : NSObject

/*!
 * @property
 *
 * @brief 注册支持的类型，内部已处理版本兼容
 */
@property (nonatomic, assign) MOPushAuthorizationOptions options;

/*!
 * @property
 *
 * @brief 注入的类别, iOS8-iOS9 UIUserNotificationCategory; iOS10 UNNotificationCategory
 */
@property (nonatomic, strong) NSSet *categories;

@end


/// 默往推送SDK 核心类
@interface MOPushClient : NSObject


///----------------------------------------------------
/// @name SDK 注册相关
///----------------------------------------------------

/*!
 * @brief 默往推送SDK的初始化接口
 *
 * @param launchOptions 系统的launchOptions启动消息参数用于处理用户通过消息打开应用相关信息
 * @param appKey 从默往开放平台注册应用获取的appkey
 * @param entity 通知注册实体类，可传nil进行默认注册
 */
+ (void)registerWithLaunchOptions:(NSDictionary *)launchOptions
                           appKey:(NSString *)appKey
                   registerEntity:(MOPushRegisterEntity *)entity;


/*!
 * @brief 向默往服务器注册该设备的deviceToken，便于发送Push消息
 *
 * @param deviceToken APNs返回的deviceToken
 * @param completion  注册回调
 */
+ (void)registerDeviceToken:(NSData *)deviceToken completion:(void (^)(BOOL granted, NSError *error))completion;


/*!
 * @brief 解除设备的注册，相当于关闭消息推送
 *
 * @warning 解除注册，会造成deviceToken变化
 */
+ (void)unregisterForRemoteNotifications;


///----------------------------------------------------
/// @name 别名相关
///----------------------------------------------------

/*!
 * @brief 设置别名
 *
 * @param alias 需要设置的别名
 * @param deleteOtherDevices 是否删除该别名之前绑定过的其他设备
 * @param completion 设置回调
 *
 * @discussion
 * 如果接入方是根据别名来推送，建议在用户登录后设置别名，或在应用启动后（用户已登录的状态下）设置别名
 * 如果不做多端推送的情况，建议 deleteOtherDevices 传 true，默往服务器最多支持一个别名绑定10台设备
 */
+ (void)setAlias:(NSString *)alias deleteOtherDevices:(BOOL)deleteOtherDevices completion:(MOPushCompletion)completion;


/*!
 * @brief 删除别名
 *
 * @param option     删除别名的方式，具体参考MOPushDeleteAliasOption枚举
 * @param completion 删除回调
 *
 * @attention 当前设备必须绑定过别名才能删除
 */
+ (void)deleteAliasWithOption:(MOPushDeleteAliasOption)option completion:(MOPushCompletion)completion;


///----------------------------------------------------
/// @name 其他功能
///----------------------------------------------------

/*!
 * @brief 设置日志输出
 *
 * @param logEnable 是否允许输出日志
 */
+ (void)setLogEnable:(BOOL)logEnable;


/*!
 * @brief 推送送达统计
 *
 * @discussion
 * 该方法用于统计推送送达率，为了精确统计数据，需要开发者集成推送扩展服务 <NotificationServiceExtension>
 * 在推送扩展的代理方法 <didReceiveNotificationRequest:withContentHandler:> 中，调用 <trackPushReceived:appKey:> 进行统计
 *
 * @attention 如果不集成推送扩展服务，在APP被杀死的情况下无法统计送达率
 */
+ (void)trackPushReceived:(NSDictionary *)userInfo appKey:(NSString *)appKey;


@end



